//
// Created by Administrator on 2021/10/21.
//

#ifndef MRENDER_BUFFERGEOMETRY_H
#define MRENDER_BUFFERGEOMETRY_H

#include <map>
#include "../matrials/Material.h"
#include "IRenderable.h"

class BufferGeometry : public Object, public IRenderable, public IDrawUIable{
private:
    /**
     * 是否索引绘制
     */
    bool bDrawIndices;

    /**
     * 如果索引绘制，索引数量；否则就是顶点数量
     */
    int drawCount;

    /**
     * 缓冲数据
     */
    GLuint vao;
    GLuint ebo;

private:
    /**
     * 配置索引
     */
    void setUpIndices();

protected:
    /**
    * 几何体应用材质
    */
    Material * p_material;

public:
    String type;
    /**
     * 增长id
     */
    int id;
    /**
     * 唯一标识id
     */
    String uuid;
    /**
     * 名称
     */
    String name;
    /**
     * 渲染模式
     */
    GLint drawMode;

    /**
     * 多边形渲染模式
     */
    GLint polygonMode;

public:
    /**
     * 顶点数据
     */
    std::vector<float> vertices;
    /**
     * 顶点索引
     */
    std::vector<int> indices;
    /**
     * 顶点颜色
     */
    std::vector<float> colors;

    /**
     * 顶点UV
     */
    std::vector<float> uvs;

    /**
    * 顶点法线
    */
    std::vector<float> normals;

public:
    void onInit() override;
    void onRender(float elapsedTime, Matrix4x4 proj, Matrix4x4 view, Matrix4x4 pworld) override;
    void getUI() override;
public:
    BufferGeometry();
    ~BufferGeometry();

    /**
     * 给attribute赋值
     * @param attrib attri属性
     * @param data 数组值
     */
    template<typename T>
    void setUpAttribute(const ShaderAttribute& attrib, std::vector<T> data);

    /**
     * 应用材质
     * @param p_material 材质实例
     */
    void applyMaterial(Material *p_material);
};


#endif //MRENDER_BUFFERGEOMETRY_H
